//
// Created by andrew on 2022/3/19.
//


#include <string>
#include <unordered_set>


#include <iostream>
#include <gtest/gtest.h>

using namespace std;
//
//class Solution {
//public:
//    static int lengthOfLongestSubstring(string s) {
//        int n = s.size();
//        if (!n) {
//            return 0;
//        }
//        // 使用hash集合，记录每个字符是否出现过,因为是字符可以考虑直接换成数组
//        unordered_set<char> occ;
//        // 右下标从0开始，将字符放入hash表中
//        int rk = 0, maxLen = 0;
//        for (int i = 0; i < n; i ++) {
//
//            while (rk < n && !occ.count(s[rk])) {
//                // 如果元素不存在就将元素放到hash表中
//                occ.insert(s[rk]);
//                rk ++;
//            }
//            // 能从上述while中出来说明rk 已经走到最后或者指到下一个重复的元素了
//            maxLen = max(maxLen, rk - i);
//            // 从头开始逐步的剔除元素，直到向hash添加元素不再有重复的
//            occ.erase(s[i]);
//        }
//        return maxLen;
//    }
//
//};


class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int n = s.size();
        if (!n) {
            return 0;
        }
        // 使用hash集合，记录每个字符是否出现过
        // unordered_set<char> occ;
        bool occ[256]{false};
        // 右下标从0开始，将字符放入hash表中
        int rk = 0, maxLen = 0;
        for (int i = 0; i < n; i ++) {

            // while (rk < n && !occ.count(s[rk])) {
            while (rk < n && !occ[s[rk]]) {
                // 如果元素不存在就将元素放到hash表中
                // occ.insert(s[rk]);
                occ[s[rk]] = true;
                rk ++;
            }
            // 能从上述while中出来说明rk 已经走到最后或者指到下一个重复的元素了
            maxLen = max(maxLen, rk - i);
            // 从头开始逐步的剔除元素，直到向hash添加元素不再有重复的
            // occ.erase(s[i]);
            occ[s[i]] = false;
        }
        return maxLen;
    }

};



TEST(SetTest1, lengthOfLongestSubstring) {

    Solution solution;
    EXPECT_EQ(solution.lengthOfLongestSubstring("pwwkew"), 3);

}




